package com.wanqing.mapper;

import com.github.pagehelper.Page;
import com.wanqing.annotation.AutoFill;
import com.wanqing.dto.BookListPageQueryDTO;
import com.wanqing.entity.BookBookList;
import com.wanqing.entity.BookList;
import com.wanqing.enumeration.OperationType;
import com.wanqing.vo.BookItemVO;
import com.wanqing.vo.BookListVO;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

/**
 * BookListMapper接口用于处理书单相关的数据库操作
 */
@Mapper
public interface BookListMapper {

    /**
     * 根据类别ID统计书单数量
     *
     * @param id 类别ID
     * @return 书单数量
     */
    @Select("select count(*) from book_list where category_id =#{id}")
    Integer countByCategoryId(Long id);

    /**
     * 分页查询书单信息
     *
     * @param bookListPageQueryDTO 分页查询条件DTO
     * @return 分页查询结果
     */
    Page<BookListVO> pageQuery(BookListPageQueryDTO bookListPageQueryDTO);

    /**
     * 保存书单信息
     *
     * @param bookList 书单实体
     */
    @Insert("insert into book_list value (#{id},#{categoryId},#{name},#{price},#{status},#{description},#{image},#{createTime},#{updateTime},#{createUser},#{updateUser})")
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
    @AutoFill(OperationType.INSERT)
    void save(BookList bookList);

    /**
     * 批量保存书单图书信息
     *
     * @param bookBookList 书单图书列表
     */
    void saveBookBookListBatch(List<BookBookList> bookBookList);

    /**
     * 更新书单信息
     *
     * @param bookList 书单实体
     */
    @AutoFill(OperationType.UPDATE)
    void update(BookList bookList);

    /**
     * 根据书单ID删除书单图书信息
     *
     * @param bookListId 书单ID
     */
    @Delete("delete from book_book_list where book_list_id = #{bookListId}")
    void deleteBookByBookListId(Long bookListId);

    /**
     * 根据ID获取书单信息
     *
     * @param id 书单ID
     * @return 书单实体
     */
    @Select("select * from book_list where id = #{id}")
    BookList getById(Long id);

    /**
     * 根据书单ID获取书单图书信息
     *
     * @param bookListId 书单ID
     * @return 书单图书列表
     */
    @Select("select * from book_book_list where book_list_id = #{bookListId}")
    List<BookBookList> getBookByBookListId(Long bookListId);

    /**
     * 批量删除书单图书信息
     *
     * @param bookListIds 书单ID列表
     */
    void deleteBookBatch(List<Long> bookListIds);

    /**
     * 批量删除书单信息
     *
     * @param ids 书单ID列表
     */
    void deleteBatch(List<Long> ids);

    /**
     * 动态条件查询书单
     *
     * @param bookList
     * @return
     */
    List<BookList> list(BookList bookList);

    /**
     * 根据书单id查询图书选项
     *
     * @param id
     * @return
     */
    @Select("select sd.name, d.image, d.description " +
            "from book_book_list sd left join book d on sd.book_id = d.id " +
            "where sd.book_list_id = #{bookListId}")
    List<BookItemVO> getBookItemByBookListId(@Param("bookListId") Long id);

    /**
     * 根据条件统计书单数量
     *
     * @param map
     * @return
     */
    Integer countByMap(Map map);
}
